home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #9 / Amiga Plus CD - 2004 - No. 09.iso / amigaplus / tools / dev_libs / feelin040718 / demos / class1.c < prev    next >
C/C++ Source or Header  |  2004-08-03  |  4KB  |  165 lines

  1. ;/*
  2.  
  3.    F_Create.rexx EXE Class1
  4.    QUIT
  5.    _________________________________________________________________________
  6.  
  7.    Demosource on how to use a customclass in C.
  8.  
  9.    Based on the MUI C example 'Class1.c'.
  10.  
  11.    Written by LAVIALE Olivier <HaploLaMain@aol.com>
  12.  
  13. */
  14.  
  15. #include <libraries/feelin.h>
  16.  
  17. #include <proto/exec.h>
  18. #include <proto/dos.h>
  19. #include <proto/graphics.h>
  20. #include <proto/feelin.h>
  21.  
  22. struct FeelinBase *FeelinBase;
  23.  
  24. /*
  25.  
  26.    Unlike MUI, Feelin doesn't use _kludges_ to access FC_Area  local  data.
  27.    This  behaviour  gives  total independency between FC_Object (FC_Notify)
  28.    and FC_Area, but need some work around.
  29.  
  30.    Most FC_Area macros access area data transparently, but  they  need  the
  31.    field 'AreaData' to be defined in the 'LOD' variable :
  32.  
  33.       local_area_data = LOD -> AreaData;
  34.  
  35.    To easily access FC_Area data get the attribute  FA_AreaData  at  object
  36.    creation   time   and  save  to  pointer  into  the  'AreaData'  of  the
  37.    'LocalObjectData' structure. Then, you can use  macros  as  usualy,  but
  38.    omitting  the  "(Obj)"  because  they use directly the variable 'LOD' of
  39.    type LocalObjectData :
  40.  
  41.       _minw
  42.  
  43.       is expanded to
  44.  
  45.       LOD -> AreaData -> MinMax.MinW
  46.  
  47. */
  48.  
  49. struct LocalObjectData
  50. {
  51.    FAreaData                       *AreaData;
  52. };
  53.  
  54. ///mNew
  55. F_METHOD(ULONG,mNew)
  56. {
  57.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  58.  
  59.    LOD -> AreaData = (FAreaData *) F_Get(Obj,FA_AreaData);
  60.  
  61.    return F_SUPERDO();
  62. }
  63. //+
  64. ///mAskMinMax
  65. F_METHOD(ULONG,mAskMinMax)
  66. {
  67.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  68.  
  69. /* 
  70.    FM_AskMinMax will be called before the window is opened and before layout
  71.    takes  place.  We need to tell Feelin the minimum and maximum size of our
  72.    object.
  73. */
  74.    _minw += 100 ; _maxw = 500;
  75.    _minh +=  40 ; _maxh = 300;
  76.  
  77.    return F_SUPERDO();
  78. }
  79. //+
  80. ///mDraw
  81. F_METHODM(void,mDraw,FS_Draw)
  82. {
  83.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  84.  
  85.    struct RastPort *rp = _rp;
  86.  
  87.    UWORD            x1 = _mx, x2 = _mx2,
  88.                     y1 = _my, y2 = _my2;
  89.  
  90.    ULONG i,c=FV_Pen_Shine;
  91.  
  92. /*
  93.    let our superclass draw itself first, FC_Area would e.g. draw  the  frame
  94.    and clear the whole region. What it does exactly depends on flags.
  95. */
  96.  
  97.    F_SUPERDO();
  98.  
  99. /* Ok, everything ready to render... */
  100.  
  101.    for (i = x1 ; i <= x2 ; i += 5)
  102.    {
  103.       _FPen(c);
  104.       _Move(x1,y2); _Draw(i,y1);
  105.       _Move(x2,y2); _Draw(i,y1);
  106.  
  107.       if (++c == FV_Pen_Highlight) c = FV_Pen_Shine;
  108.    }
  109. }
  110. //+
  111.  
  112. /// Main
  113. void main()
  114. {
  115.    FObject app,win;
  116.    struct FeelinClass *cc;
  117.  
  118.    if (FeelinBase = (APTR) OpenLibrary("feelin.library",FV_VERSION))
  119.    {
  120.       static struct FeelinMethodEntry Handlers[] =
  121.       {
  122.          (FMethod) mNew,       NULL, FM_New,
  123.          (FMethod) mAskMinMax, NULL, FM_AskMinMax,
  124.          (FMethod) mDraw,      NULL, FM_Draw,
  125.           NULL
  126.       };
  127.  
  128.       if (cc = F_CreateClass(FA_Class_LODSize,        sizeof (struct LocalObjectData),
  129.                              FA_Class_Super,          FC_Area,
  130.                              FA_Class_MethodsTable,   Handlers,
  131.                              TAG_DONE))
  132.       {
  133.          app = AppObject,
  134.             FA_Application_Title,       "Class1",
  135.             FA_Application_Version,     "$VER: Class1 1.04 (2004/03/13)",
  136.             FA_Application_Copyright,   "©2002, Olivier LAVIALE",
  137.             FA_Application_Author,      "Olivier LAVIALE (HaploLaMain@aol.com)",
  138.             FA_Application_Description, "Demonstrate the use of custom classes.",
  139.             FA_Application_Base,        "CLASS1",
  140.  
  141.             Child, win = WindowObject,
  142.                FA_ID,            MAKE_ID('M','A','I','N'),
  143.                FA_Window_Title,  "A Simple Custom Class",
  144.                FA_Window_Open,   TRUE,
  145.  
  146.                Child, F_NewObj(cc -> Name, FA_Frame,"0:28.04040404", TextBack, End,
  147.             End,
  148.          End;
  149.  
  150.          if (app)
  151.          {
  152.             F_Do(win,FM_Notify,FA_Window_CloseRequest,TRUE, app,FM_Application_Shutdown,0);
  153.             F_Do(app,FM_Application_Run);
  154.             F_DisposeObj(app);
  155.          }
  156.          F_DeleteClass(cc);
  157.       }
  158.       else Printf("Unable to create custom class\n");
  159.  
  160.       CloseLibrary(FeelinBase);
  161.    }
  162.    else Printf("Unable to open feelin.library\n");
  163. }
  164. //+
  165.